<?php
/**
 * 功能：DB入口
 * 说明：db.class.php
 * 创建日期：2012/7/22
 * 更新日期：
 * 作者：Mirze
 * 补充说明： 
 * 
 */
class db
{
	private $_dsn;

	function __construct() {
	}

	/**
	 * (功能描述) 获得一个数据库连接对象
	 *
	 * @param string $dsn_conf 要使用的数据库连接
     * @return  数据库访问对象
	 */
	static function getConn($dsn_conf = null)
    {
		self::getDSN($dsn_conf);

		if(empty($this->_dsn)) {
			throw new FException('invalid set DSN');
		}

		$dbtype = isset($this->_dsn['driver']) ? trim($this->_dsn['driver']) : 'mysql';

		$class_name = 'adapter_' . strtolower($dbtype);
        $dbo = new $class_name($this->_dsn);

		return $dbo;
	}

	/**
	 * (功能描述) 获取数据库连接DSN
	 *
	 * @param array $dsn_conf 配置参数
	 * @return array
	 */
	static function getDSN($dsn_conf=null)
	{
		if(empty($dsn_conf)) {
			throw new FException('invalid DSN');
		}
		if(is_array($dsn_conf)) {
			$dsn = $dsn_conf;
		} else {
		    $dsn = self::parseDSN($dsn_conf);
		}
		$this->_dsn = $dsn;

		return $dsn;
	}

	/**
	 * (功能描述) 将字符串形式的 DSN 转换为数组
	 *
	 * @code php
     * $string = 'mysql://root:mypass@localhost/test';
     * $dsn = QDB::parseDSN($string);
     * // 输出
     * // array(
     * //     driver:   mysql
     * //     host:     localhost
     * //     login:    root
     * //     password: mypass
     * //     database: test
     * //     port:
     * // )
     * @endcode
     *
     * @param string $dsn 要分析的 DSN 字符串
     * @return array 分析后的数据库连接信息
	 */
	static function parseDSN($dsn)
    {
		$dsn = str_replace('@/', '@localhost/', $dsn);
        $parse = parse_url($dsn);
        if (empty($parse['scheme'])) {
            return array();
        }

        $dsn = array();
        $dsn['host']     = isset($parse['host']) ? $parse['host'] : 'localhost';
        $dsn['port']     = isset($parse['port']) ? $parse['port'] : '';
        $dsn['login']    = isset($parse['user']) ? $parse['user'] : '';
        $dsn['password'] = isset($parse['pass']) ? $parse['pass'] : '';
        $dsn['driver']   = isset($parse['scheme']) ? strtolower($parse['scheme']) : '';
        $dsn['database'] = isset($parse['path']) ? substr($parse['path'], 1) : '';

        return $dsn;
	}


}

?>